package com.ruoyi.system.service.impl;

import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashMap;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.system.mapper.PageConfigMapper;
import com.ruoyi.system.mapper.PageVersionMapper;
import com.ruoyi.system.domain.PageConfig;
import com.ruoyi.system.domain.PageVersion;
import com.ruoyi.system.service.IPageConfigService;

/**
 * 页面配置Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-03-30
 */
@Service
public class PageConfigServiceImpl implements IPageConfigService 
{
    @Autowired
    private PageConfigMapper pageConfigMapper;
    
    @Autowired
    private PageVersionMapper pageVersionMapper;

    /**
     * 查询页面配置
     * 
     * @param id 页面配置主键
     * @return 页面配置
     */
    @Override
    public PageConfig selectPageConfigById(Long id)
    {
        return pageConfigMapper.selectPageConfigById(id);
    }

    /**
     * 查询页面配置列表
     * 
     * @param pageConfig 页面配置
     * @return 页面配置
     */
    @Override
    public List<PageConfig> selectPageConfigList(PageConfig pageConfig)
    {
        return pageConfigMapper.selectPageConfigList(pageConfig);
    }

    /**
     * 新增页面配置
     * 
     * @param pageConfig 页面配置
     * @return 结果
     */
    @Override
    public int insertPageConfig(PageConfig pageConfig)
    {
        pageConfig.setCreateTime(DateUtils.getNowDate());
        return pageConfigMapper.insertPageConfig(pageConfig);
    }

    /**
     * 修改页面配置
     * 
     * @param pageConfig 页面配置
     * @return 结果
     */
    @Override
    @Transactional
    public int updatePageConfig(PageConfig pageConfig)
    {
        // 保存历史版本
        saveVersionHistory(pageConfig);
        
        // 更新版本号
        if (pageConfig.getVersion() == null) {
            PageConfig oldConfig = pageConfigMapper.selectPageConfigById(pageConfig.getId());
            if (oldConfig != null) {
                pageConfig.setVersion(oldConfig.getVersion() != null ? oldConfig.getVersion() + 1L : 1L);
            } else {
                pageConfig.setVersion(1L);
            }
        } else {
            pageConfig.setVersion(pageConfig.getVersion() + 1L);
        }
        
        pageConfig.setUpdateTime(DateUtils.getNowDate());
        return pageConfigMapper.updatePageConfig(pageConfig);
    }

    /**
     * 批量删除页面配置
     * 
     * @param ids 需要删除的页面配置主键
     * @return 结果
     */
    @Override
    public int deletePageConfigByIds(Long[] ids)
    {
        return pageConfigMapper.deletePageConfigByIds(ids);
    }

    /**
     * 删除页面配置信息
     * 
     * @param id 页面配置主键
     * @return 结果
     */
    @Override
    public int deletePageConfigById(Long id)
    {
        return pageConfigMapper.deletePageConfigById(id);
    }

    /**
     * 发布页面配置
     * 
     * @param id 页面配置主键
     * @return 结果
     */
    @Override
    @Transactional
    public int publishPageConfig(Long id)
    {
        PageConfig pageConfig = pageConfigMapper.selectPageConfigById(id);
        if (pageConfig == null) {
            return 0;
        }
        
        // 设置为已发布状态
        pageConfig.setIsPublished("1");
        pageConfig.setPublishTime(DateUtils.getNowDate());
        pageConfig.setUpdateBy(SecurityUtils.getUsername());
        pageConfig.setUpdateTime(DateUtils.getNowDate());
        
        return pageConfigMapper.updatePageConfig(pageConfig);
    }
    
    /**
     * 取消发布页面配置
     * 
     * @param id 页面配置主键
     * @return 结果
     */
    @Override
    public int unpublishPageConfig(Long id)
    {
        PageConfig pageConfig = pageConfigMapper.selectPageConfigById(id);
        if (pageConfig == null) {
            return 0;
        }
        
        // 设置为未发布状态
        pageConfig.setIsPublished("0");
        pageConfig.setUpdateBy(SecurityUtils.getUsername());
        pageConfig.setUpdateTime(DateUtils.getNowDate());
        
        return pageConfigMapper.updatePageConfig(pageConfig);
    }
    
    /**
     * 获取页面版本历史记录
     * 
     * @param id 页面配置主键
     * @return 版本历史列表
     */
    @Override
    public List<Map<String, Object>> getPageVersionHistory(Long id)
    {
        // 查询版本历史
        List<PageVersion> versionList = pageVersionMapper.selectVersionsByPageId(id);
        
        // 转换为前端所需格式
        List<Map<String, Object>> resultList = new ArrayList<>();
        for (PageVersion version : versionList) {
            Map<String, Object> map = new HashMap<>();
            map.put("versionId", version.getId());
            map.put("versionNumber", version.getVersionNumber());
            map.put("createTime", version.getCreateTime());
            map.put("createBy", version.getCreateBy());
            map.put("config", version.getConfig());
            resultList.add(map);
        }
        
        return resultList;
    }
    
    /**
     * 根据页面标识查询已发布的页面配置
     * 
     * @param pageKey 页面标识
     * @return 页面配置
     */
    @Override
    public PageConfig selectPublishedPageConfigByKey(String pageKey)
    {
        PageConfig query = new PageConfig();
        query.setPageKey(pageKey);
        query.setIsPublished("1");  // 只查询已发布的页面
        query.setStatus("0");       // 只查询正常状态的页面
        
        List<PageConfig> list = pageConfigMapper.selectPageConfigList(query);
        if (list != null && !list.isEmpty()) {
            return list.get(0);
        }
        
        return null;
    }
    
    /**
     * 保存页面配置历史版本
     * 
     * @param pageConfig 页面配置
     */
    private void saveVersionHistory(PageConfig pageConfig)
    {
        PageConfig oldConfig = pageConfigMapper.selectPageConfigById(pageConfig.getId());
        if (oldConfig == null) {
            return;
        }
        
        // 保存旧版本
        PageVersion version = new PageVersion();
        version.setPageId(oldConfig.getId());
        version.setVersionNumber(oldConfig.getVersion() != null ? oldConfig.getVersion().intValue() : 1);
        version.setConfig(oldConfig.getConfig());
        version.setCreateBy(oldConfig.getUpdateBy() != null ? oldConfig.getUpdateBy() : oldConfig.getCreateBy());
        version.setCreateTime(DateUtils.getNowDate());
        
        pageVersionMapper.insertPageVersion(version);
    }
}
